/**
 * @file 应用程序主配置文件
 * @description 包含全局布局配置、初始状态管理和用户信息获取等核心功能
 */

// 基础依赖
import { history, Link } from '@umijs/max';
import React, { ReactNode } from 'react';

// 组件导入
import { AvatarDropdown, AvatarName, Footer } from '@/components';
import TabNav from '@/components/MyComponents/TabNav';
import { LinkOutlined } from '@ant-design/icons';
import type { Settings as LayoutSettings } from '@ant-design/pro-components';
import { PageLoading } from '@ant-design/pro-components';
import type { RunTimeLayoutConfig } from '@umijs/max';

// 工具和配置
import { postData } from '@/utils/request';
import defaultSettings from '../config/defaultSettings';
import store from './utils/store';
// 样式导入
import './app.less';

// 常量定义
const isDev = process.env.NODE_ENV === 'development';
const loginPath = '/user/login';

/**
 * 定义用户类型接口
 * @interface CurrentUser
 * @property {string} [avatar] - 用户头像URL
 * @property {string} [name] - 用户名称
 */
interface CurrentUser {
  avatar?: string;
  name?: string;
}

/**
 * 获取初始状态
 * @description 用于初始化全局状态，包括用户信息和布局设置
 * @see https://umijs.org/zh-CN/plugins/plugin-initial-state
 * @returns {Promise} 返回包含初始状态的Promise对象
 */
export async function getInitialState(): Promise<{
  settings?: Partial<LayoutSettings>;
  currentUser?: CurrentUser;
  loading?: boolean;
  fetchUserInfo?: () => Promise<CurrentUser | undefined>;
}> {
  const fetchUserInfo = async () => {
    try {
      // 只从token获取用户信息，不存储到本地
      const token = store.getLocal('token');
      if (token) {
        const res = await postData('/auth/userInfo', { token });
        if (res.code === 200) {
          return res.data;
        }
      }

      return undefined;
    } catch (error) {
      console.error('获取用户信息失败:', error);
      return undefined;
    }
  };

  // 如果不是登录页面，获取用户信息
  if (history.location.pathname !== loginPath) {
    const currentUser = await fetchUserInfo();
    return {
      fetchUserInfo,
      currentUser,
      settings: defaultSettings as Partial<LayoutSettings>,
    };
  }

  return {
    fetchUserInfo,
    settings: defaultSettings as Partial<LayoutSettings>,
  };
}

/**
 * 全局布局配置
 * @see https://procomponents.ant.design/components/layout
 * @description 配置全局布局的各个部分，包括页头、侧边栏、页脚等
 */
export const layout: RunTimeLayoutConfig = ({ initialState }) => {
  return {
    // ===== 顶部操作区配置 =====
    /**
     * 渲染顶部右侧操作区的内容
     * @returns {React.ReactNode[]} 返回要渲染的组件数组
     */
    // actionsRender: () => [<Question key="doc" />],

    /**
     * 用户头像及下拉菜单配置
     * @property {string} src - 头像图片地址
     * @property {ReactNode} title - 头像旁显示的标题
     * @property {Function} render - 自定义渲染头像的方法
     */
    avatarProps: {
      src: initialState?.currentUser?.avatar,
      title: <AvatarName />,
      render: (_, avatarChildren) => {
        return (
          <>
            <AvatarDropdown>{avatarChildren}</AvatarDropdown>
            <AvatarName key="doc" />
          </>
        );
      },
    },

    /**
     * 水印配置
     * @property {string} content - 水印内容，这里使用用户名
     */
    waterMarkProps: {
      content: initialState?.currentUser?.name,
    },

    // ===== 页面导航和布局配置 =====
    /**
     * 页脚配置
     * @returns {ReactNode} 返回页脚组件
     */
    footerRender: (): ReactNode => <Footer />,

    /**
     * 页面切换时的处理函数
     * @description 用于处理页面切换时的逻辑，如权限验证
     */
    onPageChange: () => {
      // 如果没有登录，重定向到 login
      if (!store.getLocal('token')) {
        // history.push(loginPath);
      }
    },

    // ===== 样式和主题配置 =====
    bgLayoutImgList: [], // 移除默认背景图片

    /**
     * 全局自定义样式
     * @property {string} background - 背景渐变色
     */
    style: {
      background: '#393C6D',
    },

    /**
     * 内容区域样式配置
     * @property {string} padding - 内边距
     * @property {number} margin - 外边距
     * @property {string} background - 背景色
     * @property {string} height - 高度设置
     * @property {string} overflow - 溢出处理
     */
    contentStyle: {
      padding: '0px',
      margin: 0,
      background: 'transparent',
      height: '100vh',
      overflow: 'hidden',
    },

    // ===== 开发调试相关配置 =====
    /**
     * 开发环境下的链接配置
     * @returns {ReactNode[]} 返回要显示的链接数组
     */
    links: isDev
      ? [
          <Link key="openapi" to="/welcome" target="_blank">
            <LinkOutlined />
            <span>律师案件管理系统</span>
          </Link>,
        ]
      : [],

    menuHeaderRender: undefined,

    /**
     * 自定义内容渲染
     * @param {ReactNode} children - 子组件
     * @returns {ReactNode} 返回处理后的内容
     */
    childrenRender: (children) => {
      if (initialState?.loading) return <PageLoading />;
      return (
        <>
          <div className="tab-nav-container">
            <TabNav />
          </div>
          <div className="main-content-container">{children}</div>
          {/* {isDev && (
            <SettingDrawer disableUrlParams enableDarkTheme settings={initialState?.settings} />
          )} */}
        </>
      );
    },

    // ===== 主题和样式配置 =====
    className: 'soft-ui-layout',

    /**
     * 主题令牌配置
     * @property {string} colorBgLayout - 布局背景色
     * @property {string} colorBgBase - 基础背景色
     * @property {string} colorTextBase - 基础文字颜色
     * @property {string} colorBgContainer - 容器背景色
     * @property {number} borderRadius - 边框圆角大小
     */
    token: {
      header: {
        colorBgHeader: '#393C6D',
        colorTextHeader: '#FFFFFF',
      },
      sider: {
        colorBgMenu: '#393C6D',
        colorTextMenu: '#FFFFFF',
      },
      pageContainer: {
        colorBgPageContainer: 'transparent',
      },
    },
    ...initialState?.settings,
  };
};
